/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.webhomesites.padrao.utils;

import br.com.webhomesites.padrao.utils.Validator;
import java.awt.Component;
import java.util.Set;
import javax.swing.JOptionPane;
import javax.validation.ConstraintViolation;
import javax.validation.ValidatorFactory;

/**
 *
 * @author Webhome
 */
@SuppressWarnings("unchecked")
public class GenericValidator<T> implements Validator<T> {

    private static ValidatorFactory factory;

    static {
        factory = javax.validation.Validation.buildDefaultValidatorFactory();
    }

    @Override
    public String validate(T entity) {
        StringBuilder sb = new StringBuilder();
        if (entity != null) {
            javax.validation.Validator validator = factory.getValidator();
            Set<ConstraintViolation<T>> constraintViolations = validator.validate(entity);

            if (!constraintViolations.isEmpty()) {
                sb.append("Validação da entidade Mercadoria\n");
                for (ConstraintViolation<T> constraint : constraintViolations) {
                    sb.append(String.format("%n%s: %s", constraint.getPropertyPath(), constraint.getMessage()));
                }
            }
        }
        return sb.toString();
    }

    @Override
    public boolean validarEntidade(Component frame, T entity) {

        String msg = validate(entity);
        if (!"".equals(msg == null ? "" : msg)) {
            JOptionPane.showMessageDialog(frame, msg, "Validação", JOptionPane.INFORMATION_MESSAGE);
            return false;
        }
        return true;
    }

    @Override
    public boolean isCPF(String cpfNum) {
        String numero = cpfNum.replace(".", "").replace("-", "");
        int[] cpf = new int[numero.length()]; //define o valor com o tamanho da string  
        int resultP = 0;
        int resultS = 0;

        if (numero.equals("00000000000")) {
            return false;
        }
        //converte a string para um array de integer  
        for (int i = 0; i < cpf.length; i++) {
            cpf[i] = Integer.parseInt(numero.substring(i, i + 1));
        }

        //calcula o primeiro número(DIV) do cpf  
        for (int i = 0; i < 9; i++) {
            resultP += cpf[i] * (i + 1);
        }
        int divP = resultP % 11;

        //se o resultado for diferente ao 10º digito do cpf retorna falso  
        if (divP != cpf[9]) {
            return false;
        } else {
            //calcula o segundo número(DIV) do cpf  
            for (int i = 0; i < 10; i++) {
                resultS += cpf[i] * (i);
            }
            int divS = resultS % 11;

            //se o resultado for diferente ao 11º digito do cpf retorna falso  
            if (divS != cpf[10]) {
                return false;
            }
        }
        return true;
    }

    @Override
    public boolean isCNPJ(String cnpj) {

        cnpj = cnpj.replace(".", "");
        cnpj = cnpj.replace("-", "");
        cnpj = cnpj.replace("/", "");

        int soma = 0, aux, dig;
        String cnpj_calc = cnpj.substring(0, 12);

        if (cnpj.length() != 14) {
            return false;
        }

        char[] chr_cnpj = cnpj.toCharArray();

        /*
         * Primeira parte
         */
        for (int i = 0; i < 4; i++) {
            if (chr_cnpj[i] - 48 >= 0 && chr_cnpj[i] - 48 <= 9) {
                soma += (chr_cnpj[i] - 48) * (6 - (i + 1));
            }
        }
        for (int i = 0; i < 8; i++) {
            if (chr_cnpj[i + 4] - 48 >= 0 && chr_cnpj[i + 4] - 48 <= 9) {
                soma += (chr_cnpj[i + 4] - 48) * (10 - (i + 1));
            }
        }
        dig = 11 - (soma % 11);

        cnpj_calc += (dig == 10 || dig == 11)
                ? "0" : Integer.toString(dig);

        /*
         * Segunda parte
         */
        soma = 0;
        for (int i = 0; i < 5; i++) {
            if (chr_cnpj[i] - 48 >= 0 && chr_cnpj[i] - 48 <= 9) {
                soma += (chr_cnpj[i] - 48) * (7 - (i + 1));
            }
        }
        for (int i = 0; i < 8; i++) {
            if (chr_cnpj[i + 5] - 48 >= 0 && chr_cnpj[i + 5] - 48 <= 9) {
                soma += (chr_cnpj[i + 5] - 48) * (10 - (i + 1));
            }
        }
        dig = 11 - (soma % 11);
        cnpj_calc += (dig == 10 || dig == 11)
                ? "0" : Integer.toString(dig);

        return cnpj.equals(cnpj_calc);
    }
}
